package LimitedTimeGame.Day_0303;

/**
 * @author zxc
 * @date 2023/03/03 09:43
 **/

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;

/**
 * 题目 ：保证文件名唯一
 * 题目详述 ：
 * 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹：在第 i 分钟，新建名为 names[i] 的文件夹。
 * 由于两个文件 不能 共享相同的文件名，因此如果新建文件夹使用的文件名已经被占用，
 * 系统会以 (k) 的形式为新文件夹的文件名添加后缀，其中 k 是能保证文件名唯一的 最小正整数 。
 * 返回长度为 n 的字符串数组，其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
 *
 * 提示：
 * 1 <= names.length <= 5 * 10^4
 * 1 <= names[i].length <= 20
 * names[i] 由小写英文字母、数字和/或圆括号组成。
 *
 */
public class GetFolderNames02 {
    /**
     * 思路 ：
     * ===》
     * （1）使用hashmap表，来存储 所要存储字符串和其后缀次数;
     * （2）遍历names数组中所有字符串，
     *  若是该字符串 在hashmap中不存在的话，则选择将 该字符串 + 该字符串的后缀次数 存储到hashmap中;
     *  若是该字符串 在hashmap中存在的话在，
     * （3）获取当前字符串在hashmap中的后缀次数，
     *  对于该后缀进行逐步累加，若是拼接后的新字符串是存在于hashmap中的话，则需要继续对于该后缀进行累加;
     *  若是拼接后的新字符串是不存在与hashmap中的话，则选择将其加入到hashmap中 && 对于原先字符串的后缀次数进行更新;
     * （4）使用result结果数组，来存储结果;
     *
     * @param names
     * @return
     */
    public String[] getFolderNames(String[] names) {
        int len = names.length;
        HashMap<String , Integer> hashMap = new HashMap<>();
        hashMap.put(names[0] , 1);
        String[] result = new String[len];
        result[0] = names[0];
        for(int i = 1 ; i < len ; i++){
            // 若是当前字符串 在hashmap中是存在的话，
            if(hashMap.containsKey(names[i])){
                Integer number = hashMap.get(names[i]);
                while(true){
                    String str = names[i] + "(" + number + ")";
                    if(!hashMap.containsKey(str)){
                       break;
                    }
                    number++;
                }
                String str = names[i] + "(" + number + ")";
                hashMap.put(names[i] , number + 1);
                hashMap.put(str , 1);
                result[i] = str;
            }
            else {
                result[i] = names[i];
                hashMap.put(names[i] , 1);
            }
        }
        return result;
    }
}
